/**
 * Created with IntelliJ IDEA.
 * Description: 园上的连线
 * User: DELL
 * Date: 2024-05-09
 * Time: 14:30
 */
public class Main1 {
    /**
     * 本题是卡特兰数的应用
     * 在圆上选择 2n 个点，将这些点成对连接起来使得所得到的 n 条线段不相交的方法数？
     * 这个问题是卡特兰数的典型应用，那么针对到本题，
     * 想法就是不断选择偶数个点，然后针对选中的点进行求卡特兰数即可
     * 同时最后需要注意一个点都不选取的时候也算一种情况
     * 本题学习的两个知识点如下：
     * 卡特兰数：Hi = H0 * Hi-1 + H1 * Hi-2 + ... + Hi-1 * H0 = C(2i,i)/(i+1) 其中H0 = 1
     * 组合数C(n,m)求法：C(n,m) = C(n-1,m) + C(n-1,m-1)
     *
     * @param args
     */

    static int N = 2023;
    static int[] H = new int[N + 1]; // 存储卡特兰数
    static int[][] C = new int[N + 1][N + 1]; // 存储组合数
    static int MOD = 2023;

    public static void main(String[] args) {
        initH();
        initC();
        int ans = 0;
        for (int i = 1; 2 * i < 2023; i++) {
            ans += C[2023][2 * i] * H[i];
            ans %= MOD;
        }
        System.out.println(ans + 1);
    }

    /**
     * 缓存卡特兰数
     */
    private static void initH() {
        H[0] = 1;
        for (int i = 1; i <= N; i++) {
            H[i] = 0;
            for (int j = 0; j < i; j++) {
                H[i] += H[j] * H[i - j - 1];
                H[i] %= MOD;
            }
        }
    }

    /**
     * 初始化组合数
     * C(n,m) = C(n-1,m) + C(n-1,m-1)
     */
    private static void initC() {
        for (int i = 0; i <= N; i++) {
            C[i][0] = C[i][i] = 1;
        }
        for (int i = 2; i <= N; i++) {
            for (int j = 1; j < i; j++) {
                C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % MOD;
            }
        }
    }
}
